`timescale 100ns/100ns

module spi_module_tb;

    parameter DATA_W = 15;
    parameter DIVIDER_W = 31;

    reg clk;
    reg rst;
    reg [DATA_W:0] data_out;
    wire [DATA_W:0] data_in;
    reg start;
    wire complete;
    reg cs_ctrl;
    reg [DIVIDER_W:0] freq_div;
    reg [1:0] mode;

    wire spi_cs;
    wire spi_mclk;
    wire spi_mosi;
    wire spi_miso;

    spi_module #(
        .DATA_WIDTH(DATA_W),
        .DIVIDER_WIDTH(DIVIDER_W))
    u_spi_module(
        /* 通用控制信号 */
        .clk(clk), // 时钟
        .rst(rst), // 复位

        /* 模块控制信号 */
        .data_in(data_out), // 数据输入
        .data_out(data_in), // 数据输出
        .start_transmit(start), // �?始传�?
        .transmit_complete(complete), // 传输完成
        .cs_ctrl(cs_ctrl), // 片�?�控�?
        .freq_div(freq_div), // 分频系数
        .mode(mode),

        /* 模块输入输出信号 */
        .cs(spi_cs), // 片�?�输�?
        .mclk(spi_mclk), // 时钟输出
        .mosi(spi_mosi), // 串行输出
        .miso(spi_miso) // 串行输入
    );

    initial begin
        $dumpfile("wave.vcd");
        $dumpvars(0, spi_module_tb);
        #2000;
        $finish;
    end

    /*******************************************************
    * 时钟
    *******************************************************/
    initial begin
        rst <= 0;
        #100; rst <= 1;
    end

    initial begin
        clk <= 0;
        forever begin
            #1; clk <= ~clk;
        end 
    end


    initial begin
        data_out <= 16'h9ABC;
        start <= 0;
        cs_ctrl <= 0;
        mode <= 0;
        freq_div <= 10;

        #100; cs_ctrl <= 1;
        #150; start <= 1;
    end

endmodule


